package com.jh.netty.instruction;

import lombok.Data;

/**
 *
 * 注意事项
 * 1、由于读卡器读卡距离不能满足10cm读卡距离，因此采用一个桌牌分配两张标签卡片。
 * 2、握手指令或者心跳指令
 */
@Data
public class Instruction {

    /**
     * 长度： (地址码 + 命令 + 数据 + 校验)的长度
     */
    private String length;

    /**
     * 地址码 1 byte
     */
    private String addressCode;

    /**
     * 命令
     */
    private String cmd;

    /**
     * mac 地址(6 byte) 或者 其他数据,
     * 握手指令时，为mac地址
     * 心跳指令时，为null
     */
    private String data;

    /**
     * 校验码(1 byte)
     */
    private String checkCode;

    /**
     * 解析握手指令或者心跳指令
     */
    public static Instruction parse(String insText) {
        if (insText.length() > 18) {
            return parseHandshakeCmd(insText);
        }

        if (insText.length() > 6) {
            return parseHeartbeatCmd(insText);
        }

        throw new RuntimeException("不符合指令规范");
    }

    /**
     * 解析握手指令
     * @param insText 16进制字符串
     * @return 解析后的指令
     *
     * 09 01 aa 00 3e 05 00 59 15 00
     */
    public static Instruction parseHandshakeCmd(String insText) {
        insText = insText.replace(" ", "");
        Instruction i = new Instruction();
        int len = insText.length();
        String tempCheckCode = insText.substring(len - 2);
        i.setCheckCode(tempCheckCode);

        String tempData = insText.substring(len - 14, len - 2);
        i.setData(tempData);

        String tempCmd = insText.substring(len - 16, len - 14);
        i.setCmd(tempCmd);

        String tempAddressCode = insText.substring(len - 18, len - 16);
        i.setAddressCode(tempAddressCode);

        String tempLen = insText.substring(0, len - 18);
        i.setLength(tempLen);

        return i;
    }

    /**
     * 解析心跳指令
     * @param insText 16进制字符串
     * @return 解析后的指令
     */
    private static Instruction parseHeartbeatCmd(String insText) {
        Instruction i = new Instruction();
        int len = insText.length();
        String tempCheckCode = insText.substring(len - 2);
        i.setCheckCode(tempCheckCode);

//        String tempMacCode = insText.substring(len - 14, len - 2);
//        i.setMacCode(tempMacCode);

        String tempCmd = insText.substring(len - 4, len - 2);
        i.setCmd(tempCmd);

        String tempAddressCode = insText.substring(len - 6, len - 4);
        i.setAddressCode(tempAddressCode);

        String tempLen = insText.substring(0, len - 6);
        i.setLength(tempLen);

        return i;
    }
}
